package com.sise.Linked;

/**
 *      24. 两两交换链表中的节点
 *
 *      给定一个链表，两两交换其中相邻的节点，并返回交换后的链表。
 *      你不能只是单纯的改变节点内部的值，而是需要实际的进行节点交换。
 *
 *      输入：head = [1,2,3,4]
 *      输出：[2,1,4,3]
 */
public class _24_swapPairs {

    /**
     *      递归
     *      1、返回值：交换完成的子链表
     *      2、设需要交换的两个点为 head 和 next，head 连接后面交换完成的子链表，next 连接 head，完成交换
     *      3、终止条件：head 为空指针或者 next 为空指针，也就是当前无节点或者只有一个节点，无法进行交换
     */
    public ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) return head;

        ListNode temp = head.next;              // 假设链表为 1->2->3->4，那么这里保存的是 2 (由于后续的返回值要作为 head.next，故此连接 1->2 就断了，所以在这里要保存起来)
        head.next = swapPairs(temp.next);       // 将 3 传递下去，继续递归。当递归结束后，返回的是 4->3，于是 1->4->3 (1.next 就是 1 的指向)
        temp.next = head;                       // 将 2 节点指向 1
        return temp;                            // 返回 2 节点
    }
}
